
// 中间件实现，链式调用
class Middleware {
    constructor() {
        this.$cache = []
        this.$middlewares = []
    }
    // 注册中间件
    use() {
        [...arguments].forEach(item => {
            if (typeof item === 'function') {
                this.$cache.push(item)
            }
        })
        return this
    }
    /**
     * 每个中间件只有两个形参 第一是传进来的参数 第二个是调用下一个中间件的函数
     * 中间件的执行顺序是根据你注册中间件的顺序来去调用的 
     */
    next(params) {
        while (this.$middlewares.length) {
            const ware = this.$middlewares.shift()
            ware.call(this, params, this.next.bind(this))
        }
    }
    execute(params) {

        // 这里可以return 一个promise 作为中间件执行，当某一中间件异常直接promise.reject, 退出执行
        this.$middlewares = this.$cache.map(fn => {  // 复制一份
            return fn;
        });
        this.next(params)
    }
}
export default Middleware






const middleware = new Middleware()
function transform(options, next) {
    console.log('before', options.data);
    options.data.age = Number(options.data.age)
    next(options); // 通过验证
}

function validate(options, next) {
    console.log('validate', options.data);
    next(options); // 通过验证
}
function send(options, next) {
    setTimeout(function () { // 模拟异步
        console.log('send', options.data);
        next();
    }, 100);
}

middleware.use(transform).use(validate).use(send)
middleware.execute({ data: { name: 'cookie', age: '20' } });
